{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "difflib module - comparing sequences and texts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''Sample text'''\n",
    "\n",
    "text1 = '''Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
    "elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
    "pulvinar porttitor tellus. Aliquam venenatis. Donec facilisis\n",
    "pharetra tortor.  In nec mauris eget magna consequat\n",
    "convalis. Nam sed sem vitae odio pellentesque interdum. Sed\n",
    "consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
    "rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
    "molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
    "tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
    "adipiscing. Suspendisse eu lectus. In nunc. Duis vulputate\n",
    "tristique enim. Donec quis lectus a justo imperdiet tempus.'''\n",
    "\n",
    "text1_lines = text1.splitlines()\n",
    "\n",
    "text2 = '''Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
    "elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
    "pulvinar, porttitor tellus. Aliquam venenatis. Donec facilisis\n",
    "pharetra tortor. In nec mauris eget magna consequat\n",
    "convalis. Nam cras vitae mi vitae odio pellentesque interdum. Sed\n",
    "consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
    "rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
    "molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
    "tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
    "adipiscing. Duis vulputate tristique enim. Donec quis lectus a\n",
    "justo imperdiet tempus.  Suspendisse eu lectus. In nunc.'''\n",
    "\n",
    "text2_lines = text2.splitlines()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Differ class works in the same way such as diff command in linux.\n",
    "\n",
    "- Lines prefixed with - were in the first sequence, but not the second.\n",
    "- Lines prefixed with + were in the second sequence, but not the first.\n",
    "- If a line has an incremental difference between versions, an extra line prefixed with ? is used to highlight the change within the new version.\n",
    "- If a line has not changed, it is printed with an extra blank space on the left column so that it is aligned with the other output that may have differences."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
      "  elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
      "- pulvinar porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "+ pulvinar, porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "?         +\n",
      "\n",
      "- pharetra tortor.  In nec mauris eget magna consequat\n",
      "?                 -\n",
      "\n",
      "+ pharetra tortor. In nec mauris eget magna consequat\n",
      "- convalis. Nam sed sem vitae odio pellentesque interdum. Sed\n",
      "?                 - --\n",
      "\n",
      "+ convalis. Nam cras vitae mi vitae odio pellentesque interdum. Sed\n",
      "?               +++ +++++   +\n",
      "\n",
      "  consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
      "  rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
      "  molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
      "  tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
      "- adipiscing. Suspendisse eu lectus. In nunc. Duis vulputate\n",
      "- tristique enim. Donec quis lectus a justo imperdiet tempus.\n",
      "+ adipiscing. Duis vulputate tristique enim. Donec quis lectus a\n",
      "+ justo imperdiet tempus.  Suspendisse eu lectus. In nunc.\n"
     ]
    }
   ],
   "source": [
    "import difflib\n",
    "\n",
    "d = difflib.Differ()\n",
    "diff = d.compare(text1_lines, text2_lines)\n",
    "print('\\n'.join(diff))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--- \n",
      "+++ \n",
      "@@ -1,11 +1,11 @@\n",
      " Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
      " elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
      "-pulvinar porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "-pharetra tortor.  In nec mauris eget magna consequat\n",
      "-convalis. Nam sed sem vitae odio pellentesque interdum. Sed\n",
      "+pulvinar, porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "+pharetra tortor. In nec mauris eget magna consequat\n",
      "+convalis. Nam cras vitae mi vitae odio pellentesque interdum. Sed\n",
      " consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
      " rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
      " molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
      " tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
      "-adipiscing. Suspendisse eu lectus. In nunc. Duis vulputate\n",
      "-tristique enim. Donec quis lectus a justo imperdiet tempus.\n",
      "+adipiscing. Duis vulputate tristique enim. Donec quis lectus a\n",
      "+justo imperdiet tempus.  Suspendisse eu lectus. In nunc.\n"
     ]
    }
   ],
   "source": [
    "#unified_diff - getting differences as the popular version control way\n",
    "\n",
    "dif = difflib.unified_diff(text1_lines, text2_lines, lineterm='')\n",
    "print('\\n'.join(dif))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*** \n",
      "--- \n",
      "***************\n",
      "*** 1,11 ****\n",
      "  Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
      "  elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
      "! pulvinar porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "! pharetra tortor.  In nec mauris eget magna consequat\n",
      "! convalis. Nam sed sem vitae odio pellentesque interdum. Sed\n",
      "  consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
      "  rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
      "  molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
      "  tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
      "! adipiscing. Suspendisse eu lectus. In nunc. Duis vulputate\n",
      "! tristique enim. Donec quis lectus a justo imperdiet tempus.\n",
      "--- 1,11 ----\n",
      "  Lorem ipsum dolor sit amet, consectetuer adipiscing\n",
      "  elit. Integer eu lacus accumsan arcu fermentum euismod. Donec\n",
      "! pulvinar, porttitor tellus. Aliquam venenatis. Donec facilisis\n",
      "! pharetra tortor. In nec mauris eget magna consequat\n",
      "! convalis. Nam cras vitae mi vitae odio pellentesque interdum. Sed\n",
      "  consequat viverra nisl. Suspendisse arcu metus, blandit quis,\n",
      "  rhoncus ac, pharetra eget, velit. Mauris urna. Morbi nonummy\n",
      "  molestie orci. Praesent nisi elit, fringilla ac, suscipit non,\n",
      "  tristique vel, mauris. Curabitur vel lorem id nisl porta\n",
      "! adipiscing. Duis vulputate tristique enim. Donec quis lectus a\n",
      "! justo imperdiet tempus.  Suspendisse eu lectus. In nunc.\n"
     ]
    }
   ],
   "source": [
    "did = difflib.context_diff(text1_lines, text2_lines, lineterm='')\n",
    "print('\\n'.join(did))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
